﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace codeding.KMeans.DataStructures.Lists
{
    public enum SeverityLevel
    {
        Fatal,
        Critical,
        Information
    }
    /// <summary>
    /// Log level of Exception
    /// </summary>
    public enum LogLevel
    {
        Debug,
        Event
    }

    public enum ExceptionType
    {
        SoChungTuDaCo = 1,
        GeneralUserError = 2,
        InvalidInputInfo = 3,
        LackOfInputInfo = 4,
        XuatHangAm,
        XuatTienAm
    }

    public class CustomException : ApplicationException
    {
        //static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(CustomException));

        private ExceptionType _ExceptionType;
        public ExceptionType ExceptionType
        {
            get
            {
                return _ExceptionType;
            }
            set
            {
                _ExceptionType = value;
            }
        }

        public CustomException(string message, ExceptionType exType)
            : base(message)
        {
            //log4net.Config.XmlConfigurator.Configure();
            _ExceptionType = exType;
        }

        public CustomException(string message, string originalMessage)
            : base(message)
        {
            //log4net.Config.XmlConfigurator.Configure();
        }

        public CustomException(string message)
            : base(message)
        {
            //log4net.Config.XmlConfigurator.Configure();
        }

        public static void WriteLog(string logMsg)
        {
            //log.Error(logMsg);
        }

        public static string GetSqlExceptionMessage(SqlException sqlEx)
        {
            //set default value which is the generic exception message
            string error = "";
            switch (sqlEx.Number)
            {
                case -2:
                    error = "Lỗi time out: vượt quá thời gian đợi khi thực hiện thao tác với máy DBServer";
                    break;
                case 2:
                    error = "Lỗi khi kết nối cơ sở dữ liệu";
                    break;
                case 547:
                    // ForeignKey Violation
                    error = string.Format("Lỗi khóa ngoại: {0}", sqlEx.Message);
                    break;
                case 1801:
                    error = "Lỗi: đã có cơ sở dữ liệu trùng tên trong máy";
                    break;
                case 1807:
                    //Could not obtain exclusive lock on database 'MODEL'
                    error = "Lỗi không thao tác được với CSDL vì CSDL này bị khóa";
                    break;
                case 2601:
                    error = "Lỗi: mã hoặc khóa này đã tồn tại";
                    break;
                case 2627:
                    // Unique Index/Constriant Violation
                    error = "Lỗi: thao tác vi phạm toàn vẹn duy nhất hoặc ràng buộc khác";
                    break;
                case 2812:
                    error = string.Format("Không tồn tại Proc {0} trong CSDL", sqlEx.Message.Substring(sqlEx.Message.IndexOf("'")));
                    break;
                case 4060:
                    // Invalid Database
                    error = "Không thể kết nối đến cơ sở dữ liệu";
                    break;
                case 18456:
                    // Login Failed
                    error = "Account sử dụng kết nối không hợp lệ";
                    break;
                default:
                    // throw a general DAL Exception
                    error = string.Format("Lỗi cơ sở dữ liệu: {0}", sqlEx.Message);
                    break;
            }
            return error;
        }
    }
}
